using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Windows.Forms;

using ComponentFactory.Krypton.Toolkit;
using csharp.rad.general;
using GrFingerXLib;

namespace csharp.rad.sisponto.kernel
{
	public class Bancos
	{
		private List<Banco> b_Items = new List<Banco>();
		public Database bd;
		public Database.Result result = new Database.Result();
		public String msgErro;
		public String _sql;

		public Bancos(Database bancoDeDados)
		{
			bd = bancoDeDados;
		}

		public List<Banco> Items
		{
			get { return b_Items; }
			set { b_Items = value; }
		}

		public String erro
		{
			get { return msgErro; }
			set { msgErro = value; }
		}

		public void add(Banco aux)
		{
			b_Items.Add(aux);
		}

		public int obter()
		{
			_sql= "SELECT id_banco, nome, telefone FROM banco ORDER BY nome";
			return (montaLista());
		}

		private int montaLista()
		{
			String tabela = "banco";
			System.Data.DataSet dtsBanco = new System.Data.DataSet();

			dtsBanco = bd.ExecuteQuery(_sql, tabela, out result);
			if( result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			b_Items.Clear();
			foreach( System.Data.DataRow linha in dtsBanco.Tables[tabela].Rows)
			{
				Banco banco = new Banco(bd);
				banco.id = Convert.ToInt32(linha["id_banco"]);
				banco.nome = Convert.ToString(linha["nome"]);
				banco.telefone = Convert.ToString(linha["telefone"]);
				b_Items.Add(banco);
			}
			dtsBanco.Dispose();
			return 1;
		}

		public int procura(String nome)
		{
			for (int i = 0; i < b_Items.Count; i++)
			{
				if(b_Items[i].nome.StartsWith(nome))
					return i;
			}
			return -1;
		}

		public int procura(int id)
		{
			for (int i = 0; i < b_Items.Count; i++)
			{
				if (b_Items[i].id.Equals(id))
					return i;
			}
			return -1;
		}
	}

	public class Titulos
	{
		private List<Titulo> t_Items = new List<Titulo>();
		public Database bd;
		public Database.Result result = new Database.Result();
		public String msgErro;
		public String _sql;
		//---------------------------------------------------------------
		public Titulos( Database bancoDeDados)
		{
			bd = bancoDeDados;
		}
		//---------------------------------------------------------------
		public List<Titulo> Items
		{
			get { return t_Items; }
			set { t_Items = value; }
		}
		//---------------------------------------------------------------
		public int obter()
		{
			_sql = "SELECT * FROM titulo_prof ORDER BY titulo";
			return (montaLista());
		}

		public int montaLista()
		{
			System.Data.DataSet dtsTitulos = new System.Data.DataSet();
			string  tabela= "Titulo";

			dtsTitulos = bd.ExecuteQuery(_sql, tabela, out result);
			if (result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			if( dtsTitulos.Tables[tabela].Rows.Count == 0)
				return 0;

			t_Items.Clear();
			foreach(System.Data.DataRow linha in dtsTitulos.Tables[tabela].Rows)
			{
				Titulo aux = new Titulo(bd);
				aux.id_titulo_prof = Convert.ToInt32(linha["id_titulo_prof"]);
				aux.titulo = Convert.ToString(linha["titulo"]);
				aux.valor_hora_aula = Convert.ToDouble(linha["valor_hora_aula"]);
				t_Items.Add(aux);
			}
			return 1;
		}

		public int procura(string titulo)
		{
			for (int i = 0; i < t_Items.Count; i++)
			{
				if (t_Items[i].titulo.StartsWith(titulo))
					return i;
			}
			return -1;
		}
		
		public int procura(int id)
		{
			for (int i = 0; i < t_Items.Count; i++)
			{
				if (t_Items[i].id_titulo_prof.Equals(id))
					return i;
			}
			return -1;
		}
	}

	public class HorariosFunc
	{
		private List<HorarioFunc> h_Items = new List<HorarioFunc>();
		private Int32 index;
		public Database bd;
		public Database.Result result = new Database.Result();
		public String msgErro;
		public String _sql;
		
		public HorariosFunc( Database bancoDeDados)
		{
			bd = bancoDeDados;
			index = 0;
		}
		public List<HorarioFunc> Items
		{
			get { return h_Items; }
			set { h_Items = value; }
		}
		
		public int obter()
		{
			_sql = "SELECT  DISTINCT(tipo) , MAX(id_horario_func) AS id_horario_func, id_secundario "
				+"FROM horario_func "
				+"GROUP BY tipo, id_secundario";
			return (montaLista());
		}

		public int obter(Int32 id_secundario)
		{
			_sql = " SELECT  * "
				+" FROM horario_func "
				+" WHERE id_secundario = "+id_secundario
				+" ORDER BY dia_semana";
			return (montaListaTodos());
		}
		
		public int obterTodos()
		{
			_sql = "SELECT  * "
				+"FROM horario_func "
				+"ORDER BY id_secundario, dia_semana";
			return (montaListaTodos());
		}
		
		private int montaLista()
		{
			System.Data.DataSet dtsHorarios = new System.Data.DataSet();
			string  tabela= "horario_func";

			dtsHorarios = bd.ExecuteQuery(_sql, tabela, out result);
			if (result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			if( dtsHorarios.Tables[tabela].Rows.Count == 0)
				return 0;

			h_Items.Clear();
			foreach(System.Data.DataRow linha in dtsHorarios.Tables[tabela].Rows)
			{
				HorarioFunc aux = new HorarioFunc(bd);
				aux.id_horario_func = Convert.ToInt32(linha["id_horario_func"]);
				aux.id_secundario = Convert.ToInt32(linha["id_secundario"]);
				aux.tipo = Convert.ToString(linha["tipo"]);
				h_Items.Add(aux);
			}
			return 1;
		}

		private int montaListaTodos()
		{
			System.Data.DataSet dtsHorarios = new System.Data.DataSet();
			string  tabela= "horario_func";
			DateTime aux;
			
			dtsHorarios = bd.ExecuteQuery(_sql, tabela, out result);
			if (result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			if( dtsHorarios.Tables[tabela].Rows.Count == 0)
				return 0;

			h_Items.Clear();
			foreach(System.Data.DataRow registro in dtsHorarios.Tables[tabela].Rows)
			{
				HorarioFunc horario = new HorarioFunc(bd);
				horario.tipo = registro["tipo"].ToString();
				horario.dia_semana = Convert.ToInt32(registro["dia_semana"].ToString());
				
				aux = Convert.ToDateTime(registro["entrada"]);
				horario.entrada = new TimeSpan(aux.Hour, aux.Minute, aux.Second);
				
				aux = Convert.ToDateTime(registro["almoco"]);
				horario.almoco = new TimeSpan(aux.Hour, aux.Minute, aux.Second);
				
				aux = Convert.ToDateTime(registro["retorno"]);
				horario.retorno = new TimeSpan(aux.Hour, aux.Minute, aux.Second);
				
				aux = Convert.ToDateTime(registro["saida"]);
				horario.saida = new TimeSpan(aux.Hour, aux.Minute, aux.Second);
				
				horario.semanal = Convert.ToBoolean(registro["semanal"]);
				
				horario.id_secundario = Convert.ToInt32(registro["id_secundario"]);
				h_Items.Add(horario);
			}
			
			return 1;
		}
		
		public int procura(int id)
		{
			for (int i = 0; i < h_Items.Count; i++)
			{
				if (h_Items[i].id_horario_func.Equals(id))
					return i;
			}
			return -1;
		}

		public int procura(String tipo)
		{
			for (int i = 0; i < h_Items.Count; i++)
			{
				if (h_Items[i].tipo.Equals(tipo))
					return i;
			}
			return -1;
		}

		public int procuraIdSecundario(int idSecundario)
		{
			for (int i = 0; i < h_Items.Count; i++)
			{
				if (h_Items[i].id_secundario.Equals(idSecundario))
					return i;
			}
			return -1;
		}
		
		public int getHorarioFunc(Int32 id_secundario, DateTime aux)
		{
			int dia_semana, tam, i;
			
			tam = h_Items.Count;
			for( i=0; i < tam; i++)
			{
				if( h_Items[i].id_secundario.Equals(id_secundario))
				{
					if( h_Items[i].semanal)
					{
						dia_semana = Functions.getDayOfWeek(aux.DayOfWeek);
					}
					else
						dia_semana = aux.Day;
					
					while(h_Items[i].dia_semana != dia_semana && i < tam)
						i++;
					
					break;
				}
			}
			index = i;
			if( i < tam)
				return i;
			index = 0;
			return -1;
		}
		
		public int getHorarioFunc(Int32 id_secundario, Int32 dia_semana)
		{
			int tam, i;
			
			tam = h_Items.Count;
			for( i=0; i < tam; i++)
			{
				if( (h_Items[i].id_secundario == id_secundario) && (h_Items[i].dia_semana == dia_semana) )
				{
					index = i;
					return i;
				}
			}
			return -1;
		}
		
		public HorarioFunc Current()
		{
			return h_Items[index];
		}
		
		public void Next()
		{
			index++;
		}
		
		public TimeSpan horasTrabalho(Int32 id_secundario, DateTime aux)
		{
			getHorarioFunc(id_secundario, aux);
			
			return Current().horasTrabalho();
		}
		
		public bool diaDeTrabalho(Int32 id_secundario, DateTime aux)
		{
			getHorarioFunc(id_secundario, aux);
			
			return Current().diaDeTrabalho();
		}
	}

	public class HorariosDisc
	{
		private List<HorarioDisc> h_Items = new List<HorarioDisc>();
		public Database bd;
		public Database.Result result = new Database.Result();
		public String msgErro;
		public String _sql;
		public List<String> cabecalho = new List<String>();
		
		
		public HorariosDisc(Database bancoDeDados)
		{
			bd = bancoDeDados;
		}
		
		public List<HorarioDisc> Items
		{
			get { return h_Items; }
			set { h_Items = value; }
		}
		
		public int obter(int id_disc)
		{
			_sql = "SELECT DISTINCT(inicio) as horario FROM horario_disc";
			montaCabecalho(_sql);
			
			_sql = " SELECT * "
				+" FROM horario_disc "
				+" WHERE id_disc = "+id_disc
				+" ORDER BY dia_semana, inicio ";
			return (montaLista());
		}
		
		private int montaLista()
		{
			System.Data.DataSet dtsHorarios = new System.Data.DataSet();
			string  tabela= "horario_disc";
			DateTime data;
			
			dtsHorarios = bd.ExecuteQuery(_sql, tabela, out result);
			if (result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			if( dtsHorarios.Tables[tabela].Rows.Count == 0)
				return 0;
			
			h_Items.Clear();
			foreach(System.Data.DataRow linha in dtsHorarios.Tables[tabela].Rows)
			{
				HorarioDisc aux = new HorarioDisc(bd);
				aux.id_horario_disc = Convert.ToInt32(linha["id_horario_disc"]);
				aux.id_disc = Convert.ToInt32(linha["id_horario_disc"]);
				aux.ano = Convert.ToInt32(linha["ano"]);
				aux.semestre = Convert.ToInt32(linha["semestre"]);
				aux.dia_semana = Convert.ToInt32(linha["dia_semana"]);
				data = Convert.ToDateTime(linha["inicio"]);
				aux.inicio = new TimeSpan(data.Hour, data.Minute, data.Second);
				data = Convert.ToDateTime(linha["fim"]);
				aux.fim = new TimeSpan(data.Hour, data.Minute, data.Second);
				
				h_Items.Add(aux);
			}
			return 1;
		}
		
		private void montaCabecalho(String _sql)
		{
			DataSet dsHorarios;
			DateTime aux;
			
			dsHorarios = bd.ExecuteQuery(_sql,"horario_disc",out result);
			if( result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return;
			}
			if( dsHorarios.Tables[0].Rows.Count <= 0)
				return;
			
			foreach(DataRow linha in dsHorarios.Tables[0].Rows)
			{
				aux = Convert.ToDateTime(linha["horario"]);
				String hora = aux.ToString("HH:mm:ss");
				cabecalho.Add(hora);
			}
		}
		
		public Boolean procura(String horario, int dia_semana)
		{
			for (int i = 0; i < h_Items.Count; i++)
			{
				if ( (h_Items[i].inicio.ToString().Equals(horario)) && (h_Items[i].dia_semana == dia_semana))
					return true;
			}
			return false;
		}
	}
	
	public class Cursos
	{
		private List<Curso> c_Items = new List<Curso>();
		private Database bd;
		public Database.Result result = new Database.Result();
		private String msgErro;
		private String _sql;

		public Cursos(Database bancoDeDados)
		{
			bd = bancoDeDados;
		}

		public List<Curso> Items
		{
			get { return c_Items; }
		}

		public int obter()
		{
			_sql = "SELECT id_curso, nome, coordenador FROM curso ORDER BY nome";
			return (montaLista());
		}

		private int montaLista()
		{
			String tabela = "curso";
			System.Data.DataSet dtsCurso = new System.Data.DataSet();

			dtsCurso = bd.ExecuteQuery(_sql, tabela, out result);
			if (result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			c_Items.Clear();
			foreach (System.Data.DataRow linha in dtsCurso.Tables[tabela].Rows)
			{
				Curso aux = new Curso(bd);
				aux.id_curso =    Convert.ToInt32(linha["id_curso"]);
				aux.nome =        Convert.ToString(linha["nome"]);
				aux.coordenador = Convert.ToInt32(linha["coordenador"]);
				c_Items.Add(aux);
			}
			dtsCurso.Dispose();
			return 1;
		}

		public int procura(String nome)
		{
			for (int i = 0; i < c_Items.Count; i++)
			{
				if (c_Items[i].nome.StartsWith(nome))
					return i;
			}
			return -1;
		}

		public int procura(int id)
		{
			for (int i = 0; i < c_Items.Count; i++)
			{
				if (c_Items[i].id_curso.Equals(id))
					return i;
			}
			return -1;
		}
	}

	public class Feriados
	{
		private List<Feriado> f_Items = new List<Feriado>();
		public Database bd;
		public Database.Result result = new Database.Result();
		public String msgErro;
		public String _sql;

		public Feriados(Database bancoDeDados)
		{
			bd = bancoDeDados;
		}

		public List<Feriado> Items
		{
			get { return f_Items; }
			set { f_Items = value; }
		}

		public String erro
		{
			get { return msgErro; }
			set { msgErro = value; }
		}


		public int obter()
		{
			_sql = "SELECT * FROM feriado ORDER BY data";
			return (montaLista());
		}

		private int montaLista()
		{
			String tabela = "feriado";
			System.Data.DataSet dtsFeriado = new System.Data.DataSet();

			dtsFeriado = bd.ExecuteQuery(_sql, tabela, out result);
			if (result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			f_Items.Clear();
			foreach (System.Data.DataRow linha in dtsFeriado.Tables[tabela].Rows)
			{
				Feriado fer = new Feriado(bd);
				fer.id_feriado = Convert.ToInt32(linha["id_feriado"]);
				fer.data = Convert.ToString(linha["data"]);
				fer.motivo = Convert.ToString(linha["motivo"]);
				f_Items.Add(fer);
			}
			dtsFeriado.Dispose();
			return 1;
		}


		public int procura(int id)
		{
			for (int i = 0; i < f_Items.Count; i++)
			{
				if (f_Items[i].id_feriado.Equals(id))
					return i;
			}
			return -1;
		}
		
		public int procura(DateTime data)
		{
			String aux = data.ToString("dd/MM");
			
			for (int i = 0; i < f_Items.Count; i++)
				if (data.Equals(f_Items[i].data))
				return i;
			return -1;
		}
	}

	public class Digitais
	{
		List<TTemplate> lstDigitais = new List<TTemplate>();
		Database bd;
		Database.Result result = new Database.Result();

		public Digitais(Database bancoDeDados)
		{
			bd = bancoDeDados;
		}

		public List<TTemplate> montaLista()
		{
			string _sql;
			DataSet dsDigitais;

			_sql = " SELECT   "
				+" digital.id_digital, "
				+" digital.dedo, "
				+" digital.id_funcionario,"
				+" digital.template, "
				+" digital.master "
				+" FROM digital "
				+" JOIN funcionario ON funcionario.id_funcionario = digital.id_funcionario AND funcionario.ativo= true "
				+" ORDER BY id_funcionario, dedo";
			dsDigitais = bd.ExecuteQuery(_sql, "digital", out result);

			if (result.Status == Database.Status.Failed)
			{
				KryptonMessageBox.Show("Erro ao tentar acessar a tabela de digitais, erro: " + result.ErrorMessage);
				return lstDigitais;
			}
			else
			{
				byte[] bTemp = new byte[(int)GRConstants.GR_MAX_SIZE_TEMPLATE];
				foreach (DataRow linha in dsDigitais.Tables[0].Rows)
				{
					TTemplate ttTemp = new TTemplate();
					/*
               sTemp = Convert.ToString(linha["template"]);
               bTemp = Convert.FromBase64String(sTemp);

               Array.Copy(bTemp, 0, ttTemp._tpt, 0, bTemp.Length);*/
					ttTemp._tpt = (Byte[])linha["template"];
					ttTemp._size = bTemp.Length;
					
					ttTemp.id = Convert.ToInt32(linha["id_digital"]);
					ttTemp.id_func = Convert.ToInt32(linha["id_funcionario"]);
					ttTemp.master = Convert.ToBoolean(linha["master"]);
					lstDigitais.Add(ttTemp);
				}
			}
			return lstDigitais;
		}
	}
	
	public class Disciplinas
	{
		public struct stDisciplina
		{
			public int id_disciplina;
			public int id_prof;
			public int id_curso;
			public String nome_disc;
			public String nome_prof;
			public String nome_curso;
			public int periodo;
		}
		private List<stDisciplina> f_items = new List<stDisciplina>();
		public Database bd;
		public Database.Result result = new Database.Result();
		public String msgErro;
		public String _sql;

		public Disciplinas(Database bancoDeDados)
		{
			bd = bancoDeDados;
		}

		public List<stDisciplina> Items
		{
			get { return f_items; }
		}

		public String erro
		{
			get { return msgErro; }
			set { msgErro = value; }
		}


		public int obter()
		{
			_sql =  "SELECT "
				+"disciplina.id_disciplina, "
				+"disciplina.nome as nome_disc, "
				+"disciplina.id_curso, "
				+"disciplina.id_prof, "
				+"funcionario.nome as nome_prof, "
				+"curso.nome as nome_curso, "
				+"disciplina.periodo "
				+"FROM disciplina "
				+"JOIN  funcionario "
				+"ON disciplina.id_prof = funcionario.id_funcionario "
				+"JOIN  curso "
				+"ON disciplina.id_curso = curso.id_curso "
				+"ORDER BY disciplina.nome ";
			return (montaLista());
		}

		private int montaLista()
		{
			String tabela = "disciplina";
			System.Data.DataSet dtsDisciplina = new System.Data.DataSet();

			dtsDisciplina = bd.ExecuteQuery(_sql, tabela, out result);
			if (result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			f_items.Clear();
			foreach (System.Data.DataRow linha in dtsDisciplina.Tables[tabela].Rows)
			{
				stDisciplina d = new stDisciplina();
				d.id_disciplina = Convert.ToInt32(linha["id_disciplina"]);
				d.nome_disc     = Convert.ToString(linha["nome_disc"]);
				d.id_curso      = Convert.ToInt32(linha["id_curso"]);
				d.id_prof       = Convert.ToInt32(linha["id_prof"]);
				d.periodo       = Convert.ToInt32(linha["periodo"]);
				d.nome_prof     = Convert.ToString(linha["nome_prof"]);
				d.nome_curso    = Convert.ToString(linha["nome_curso"]);
				f_items.Add(d);
			}
			dtsDisciplina.Dispose();
			return 1;
		}


		public int procura(int id)
		{
			for (int i = 0; i < f_items.Count; i++)
			{
				if (f_items[i].id_disciplina.Equals(id))
					return i;
			}
			return -1;
		}
		
		public int procuraDisciplina(String aux)
		{
			for (int i = 0; i < f_items.Count; i++)
			{
				if (f_items[i].nome_disc.Contains(aux))
					return i;
			}
			return -1;
		}

		public int procuraProfessor(String aux)
		{
			for (int i = 0; i < f_items.Count; i++)
			{
				if (f_items[i].nome_prof.Contains(aux))
					return i;
			}
			return -1;
		}
		
		public int procuraCurso(String aux)
		{
			for (int i = 0; i < f_items.Count; i++)
			{
				if (f_items[i].nome_curso.Contains(aux))
					return i;
			}
			return -1;
		}
		
		public void sortDisciplinas()
		{
			f_items.Sort(delegate(stDisciplina p1, stDisciplina p2) { return p1.nome_disc.CompareTo(p2.nome_disc); });
		}
		
		public void sortProfessores()
		{
			f_items.Sort(delegate(stDisciplina p1, stDisciplina p2) { return p1.nome_prof.CompareTo(p2.nome_prof); });
		}

		public void sortCursos()
		{
			f_items.Sort(delegate(stDisciplina p1, stDisciplina p2) { return p1.nome_curso.CompareTo(p2.nome_curso); });
		}
	}

	public class Medias
	{
		private Int32 id_func;
		
		public int Id_func {
			get { return id_func; }
			set { id_func = value; }
		}
		
		private String nome;
		
		public string Nome {
			get { return nome; }
			set { nome = value; }
		}
		/*private Int32 mes1;
		private Int32 mes2;
		private Int32 mes3;
		private Int32 media;*/
	}

	public class Ocorrencias
	{
		public struct stOcorrencias
		{
			public int id_ocorrencia;
			public int id_func;
			public String nome_func;
			public String tipo_ocorrencia;
			public DateTime data_inicio;
			public DateTime data_fim;
		}
		
		private List<stOcorrencias> o_items = new List<stOcorrencias>();
		public Database bd;
		public Database.Result result = new Database.Result();
		public String msgErro;
		public String _sql;
		public Int32 index;
		
		public Ocorrencias(Database bancoDeDados)
		{
			bd = bancoDeDados;
		}

		public List<stOcorrencias> Items
		{
			get { return o_items; }
		}

		public String erro
		{
			get { return msgErro; }
			set { msgErro = value; }
		}


		public int obter()
		{
			_sql = "SELECT " +
				"o.id_ocorrencia, " +
				"f.id_funcionario, " +
				"f.nome, " +
				"o.tipo_ocorrencia, "+
				"o.data_inicio, " +
				"o.data_fim "+
				"FROM " +
				"ocorrencia o " +
				"INNER JOIN " +
				"funcionario f " +
				"ON o.id_func = f.id_funcionario " +
				"WHERE f.ativo "+
				"ORDER BY nome, data_inicio, data_fim";
			return (montaLista());
		}

		public int obter(DateTime data_ini, DateTime data_fim)
		{
			_sql = "SELECT " +
				"o.id_ocorrencia, " +
				"f.id_funcionario, " +
				"f.nome, " +
				"o.tipo_ocorrencia, "+
				"o.data_inicio, " +
				"o.data_fim "+
				"FROM " +
				"ocorrencia o " +
				"INNER JOIN " +
				"funcionario f " +
				"ON o.id_func = f.id_funcionario " +
				"WHERE f.ativo " +
				      " AND " +
				      " ( (data_inicio BETWEEN '"+data_ini.ToString("yyyy/MM/dd")+"' AND '"+data_fim.ToString("yyyy/MM/dd")+"') " +
				         " OR  " +
				        " (data_fim BETWEEN '"+data_ini.ToString("yyyy/MM/dd")+"' AND '"+data_fim.ToString("yyyy/MM/dd")+"')  " +
				      " )  " +
				"ORDER BY nome, data_inicio, data_fim";
			return (montaLista());
		}
		
		public int obter(String nome_func, DateTime data_ini, DateTime data_fim)
		{
			_sql = "SELECT " +
				"o.id_ocorrencia, " +
				"f.id_funcionario, " +
				"f.nome, " +
				"o.tipo_ocorrencia, "+
				"o.data_inicio, " +
				"o.data_fim "+
				"FROM " +
				"ocorrencia o " +
				"INNER JOIN " +
				"funcionario f " +
				"ON o.id_func = f.id_funcionario " +
				"WHERE f.ativo " +
				      " AND " +
					  " (f.nome LIKE '%"+nome_func+"%') " +
				      " AND " +
				      " ( (data_inicio BETWEEN '"+data_ini.ToString("yyyy/MM/dd")+"' AND '"+data_fim.ToString("yyyy/MM/dd")+"') " +
				         " OR  " +
				        " (data_fim BETWEEN '"+data_ini.ToString("yyyy/MM/dd")+"' AND '"+data_fim.ToString("yyyy/MM/dd")+"')  " +
				      " )  " +
				"ORDER BY nome, data_inicio, data_fim";		
			return montaLista();
		}
		
		private int montaLista()
		{
			String tabela = "ocorrencia";
			System.Data.DataSet dtsOcorrencias = new System.Data.DataSet();

			dtsOcorrencias = bd.ExecuteQuery(_sql, tabela, out result);
			if (result.Status == Database.Status.Failed)
			{
				msgErro = result.ErrorMessage;
				return -1;
			}
			o_items.Clear();
			foreach (System.Data.DataRow linha in dtsOcorrencias.Tables[tabela].Rows)
			{
				stOcorrencias o = new stOcorrencias();
				o.id_ocorrencia = Convert.ToInt32(linha["id_ocorrencia"]);
				o.id_func  = Convert.ToInt32(linha["id_funcionario"]);
				o.nome_func = Convert.ToString(linha["nome"]);
				o.data_inicio = Convert.ToDateTime(linha["data_inicio"]);
				o.data_fim = Convert.ToDateTime(linha["data_fim"]);
				o.tipo_ocorrencia = Convert.ToString(linha["tipo_ocorrencia"]);
				o_items.Add(o);
			}
			dtsOcorrencias.Dispose();
			return 1;
		}

		public int procura(int id)
		{
			index = -1;
			for (int i = 0; i < o_items.Count; i++)
				if (o_items[i].id_ocorrencia.Equals(id))
				index = i;
			return index;
		}
		
		public int procura (int id, DateTime data)
		{
			data= standardizeDate(data);
			
			for (int i = 0; i < o_items.Count; i++)
				if (( data >= o_items[i].data_inicio ) && (data <= o_items[i].data_fim) && (o_items[i].id_func.Equals(id)))
				return i;
			return -1;
		}
		
		public int procuraData(DateTime data)
		{
			data= standardizeDate(data);
			
			for (int i = 0; i < o_items.Count; i++)
				if (( data >= o_items[i].data_inicio ) && (data <= o_items[i].data_fim))
				return i;
			return -1;
		}
		
		private DateTime standardizeDate(DateTime data)
		{
			//Zera
			data= data.AddHours(-data.Hour);
			data= data.AddMinutes(-data.Minute);
			data= data.AddSeconds(-data.Second);
			data= data.AddMilliseconds(-data.Millisecond);
			
			//gambiarra
			return Convert.ToDateTime(data.ToString("dd/MM/yyyy"));
		}
	}

	//Criado com a metodologia frm (fast rogerius method)
	public class Entradas : csharp.common.DefaultList , csharp.common.IList
	{
		List<Entrada> _items = new List<Entrada>();
		Database bd;
		
		public Entradas(Database bd)
		{
			gsql.table = "entrada_func";
			this.bd = bd;
		}
		
		public int count()
		{
			return _items.Count;
		}
		
		
		public void add(Entrada value)
		{
			_items.Add(value);
		}
		
		public Entrada get()
		{
			return _items[index];
		}
		
		public Entrada get(int index)
		{
			return _items[index];
		}
		
		public bool fillList()
		{
			gsql.prepare();
			gsql.setValue("","*");
			
			return mountList();
		}
		
		public bool fillListByFunc(string id)
		{
			gsql.prepare();
			gsql.setValue("","*");
			gsql.conditionalWhere = "id_func = "+id;
			
			return mountList();
		}
		
		public bool fillListByFunc(string id, string dataInicio, string dataFim)
		{
			gsql.prepare();
			gsql.setValue("","*");
			gsql.conditionalWhere = "id_func = "+id;
			gsql.conditionalWhere = "(data BETWEEN '"+dataInicio+"' AND '"+dataFim+"')";
			
			return mountList();			
		}
		
		public bool fillListNaoProcessadas(string id, string dataInicio, string dataFim)
		{
			gsql.prepare();
			gsql.setValue("","*");
			gsql.conditionalWhere = "id_func = "+id;
			gsql.conditionalWhere = "(data BETWEEN '"+dataInicio+"' AND '"+dataFim+"')";
			gsql.conditionalWhere = "(not processada)";
			gsql.additionalWhere  = "ORDER BY data";
			
			return mountList();			
		}		
		
		private bool mountList()
		{
			int tam;
			
			if (!gsql.execute())
			{
				msgErro = gsql.getMsgErro();
				return false;
			}
			
			tam = gsql.getRowCount();
			clear();
			for(int i=0; i < tam; i++)
			{
				Entrada aux = new Entrada(bd);
				aux.get(gsql.getRow(i));
				
				_items.Add(aux);
			}
			return true;
		}	
		
	}
}
